package com.pymboss.imc;

/**
 *
 * @author EAC
 */
abstract class CalculadorImc {

    public enum ImcOMS {
        DELGADEZ_SEVERA(0d, 16d, "Delgadez severa"),
        DELGADEZ_MODERADA(16d, 17d, "Delgadez moderada"),
        DELGADEZ_NO_MUY_PRONUNCIADA(17d, 18.5d, "Delgadez no muy pronunciada"),
        NORMAL(18.5d, 25d, "Índice normal"),
        PREOBESO(25d, 30d, "Sobrepeso, preobeso"),
        OBESO_TIPO_1(30d, 35d, "Obesidad tipo 1"),
        OBESO_TIPO_2(35d, 40d, "Obesidad tipo 2"),
        OBESO_TIPO_3(40d, Double.MAX_VALUE, "Obesidad tipo 3"),
        IMC_ERRONEO(-1d, -1d, "Datos erróneos");
        
        private final double desde;   // indice menor
        private final double hasta; // indice mayor
        private final String descripcion;

        ImcOMS(double desde, double hasta, String descripcion) {
            this.desde = desde;
            this.hasta = hasta;
            this.descripcion = descripcion;
        }

        @Override
        public String toString() {
            return descripcion;
        }
    }
    // 

    /**
     * Cálculo del imcOMS - índice de masa corporal
     * @param  peso peso de la persona en Kg
     * @param  altura altura de la persona en metros
     * @return -1 en caso de excepción
     */
    public static double imc(double peso, double altura) {
        if ((altura <= 0) || (peso <= 0) || (peso > 400) || (altura > 3)) {
            return -1;
        }
        try {
            return (peso / Math.pow(altura, 2));
        } catch (Exception e) {
            return -1;
        }
    }

    /**
     * Cálculo del imcOMS - índice de masa corporal
     * @param  peso peso de la persona en Kg
     * @param  altura altura de la persona en metros
     * @return Enum ImcOMS conClasificación de la OMS del estado nutricional de acuerdo
     * con el IMC Índice de Masa Corporal
     */
    public static ImcOMS imcOMS(double peso, double altura) {
        double imcCalculado;
        imcCalculado = imc(peso, altura);
        for (ImcOMS tramo: ImcOMS.values()){
            if ((imcCalculado >=tramo.desde)&&(imcCalculado<tramo.hasta))
                return tramo;
        }
        return ImcOMS.IMC_ERRONEO;
    }
}
